home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / ebsx130 / ebhon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-07  |  18.6 KB  |  833 lines

  1. /*
  2.  * 追補版 SX-Window programming のサンプルCSAMPLE.Cと
  3.  * ほぼ等価な働きをするはずだったMSXLIBのサンプル
  4.  *
  5.  *  1993  7/23(Fri)
  6.  *  1996  1/28(Sun)
  7.  */
  8. #include <method/Dialog_i.h>
  9. #include <method/Event_i.h>
  10. #include <method/Graph_i.h>
  11. #include <method/Memory_i.h>
  12. #include <method/Task_i.h>
  13. #include <method/Text_i.h>
  14. #include <method/Window_i.h>
  15. #include <method/femac.h>
  16. #include <method/methodSx.h>
  17. #include <method/Dos_i.h>
  18. #include <method\sxutil.h>
  19. #include "common2.h"
  20.  
  21.  
  22. #define WINOPT (WC_SCROLL | WC_GBOX) /* ウィンドウオプション */
  23. #define MAIN_GSIZE {308, 256+22, 750, 500} /* サイズボックスで操作出来るウインドウの最小最大大きさ */
  24. #define MAIN_WIN_DX 308        /* メインウインドウの横幅 */
  25. #define MAIN_WIN_DY 256+22    /* メインウインドウの縦幅 */
  26. #define LINEMAX 128        /* 1行に入る文字数 */
  27. /* #define CACHESIZE 4096    */    /* キャッシュサイズ */
  28. #define TEXTSIZE 10        /* キャッシュサイズ */
  29.  
  30. point_t fontSize = Point_t(16,16);
  31. char    text[] = "NULL";        /* テキスト格納用 */
  32. int     command = 0;        /* 現在処理中のコマンド */
  33. char    *bunkenFile;
  34.  
  35. /* ken グローバル変数 */
  36. char        *tex;        /* jis2shift()で使うワーク */
  37. int        cdfile = 0;
  38. /* char        out[ 0x800*10 ]; */
  39. char        e_key = 0;
  40. unsigned int    nextpos;
  41.  
  42. unsigned int    indexpage , indexoff;    /* kenji suzuki */ 
  43. int        limit;
  44.  
  45. /* linkInfo *link; */
  46.  
  47. char    wintitle[ 40 ];        /* ウィンドウのタイトル */
  48.  
  49.  
  50. /*
  51.  * 関数宣言
  52.  */
  53. void    exit(int);
  54.  
  55. int        MainDraw(void);
  56. /* int        EscCancel(method_t *tm);
  57. int        EscCtrl(method_t *tm);
  58. int        DrawDialog(void);
  59. int        Dropped(void);
  60. */
  61. int        MenuProc(void);
  62. /*
  63. int        LCCBtnProc(void);
  64. int        FnameProc(void);
  65. */
  66. int        FixAll(void);
  67. /* int        ExecCommand(void);
  68. */
  69. int        MultiMouse(void);
  70. int        DispPrev( void );
  71. int        DispNext( void );
  72. int        DispUp( void );
  73. int        DispImage( unsigned int );
  74. int        DispImageEP( unsigned int );
  75. int        DispMenu( void );
  76. int        DispLink( unsigned int );
  77. int        DoSound( void );
  78. int    Set_text( void );
  79. void    AdjText(void);
  80. void    AdjWinScrBar(void);
  81. void    MainLoop(void);
  82. /* void    ChangeFontSize(point_t siz);
  83. */
  84. int        Init(void);
  85. void    main(int , char *[]);
  86.  
  87.  
  88. /*
  89.  * 描画関数リスト
  90.  */
  91. proc_list_t mainDraw = {MainDraw, NULL /* リスト終了 */};
  92.  
  93. /*
  94.  * ウインドウ定義
  95.  */
  96. window_t mainWin = {
  97.     &mainDraw,                /* @描画ルーチンへ */
  98.     (window *) NULL,        /* @ウインドウ定義レコードへ */
  99.     (window *) -1,            /* @通常-1 重ねるウインドウへ */
  100.     {0, 0, MAIN_WIN_DX, MAIN_WIN_DY},
  101.                             /* @ウインドウの大きさを示すレクタングル */
  102.     "\@本文",            /* @ウインドウタイトルへ LASCII */
  103.     0,                        /* @可視フラグ */
  104.     (0x20 << 4)+ WINOPT,    /* @rsc WDEFのID*16 + オプション */
  105.     0b1101,                    /* @付属品フラグ
  106.         bit0:クローズボタン, bit1:ウインドウ用水平スクロールバー,
  107.         bit2:ウインドウ用垂直スクロールバー, bit3:サイズボタン */
  108.     Point_t(6*LINEMAX, 0)
  109.                             /* @スクロールバーの最大値(x,y)->(H,V) */
  110. };
  111.  
  112. /*
  113.  * 各種Methodの内容定義
  114.  */
  115. m_text_t textTM = { /* テキスト編集用 */
  116.     text,            /* @文字列格納領域へ ※格納領域もちゃんとしてあること */
  117.     TEXTSIZE,        /* @最大文字数 */
  118.     {0, 22, 300, 500+22},
  119.                     /* @編集領域 view & rect */
  120.     1,                /* @文字の種類 kind */
  121.     0,                /* @文字の属性 face */
  122.     0,                /* @文字の書き方 mode */
  123.     Point_t(0, 0),    /* @文字の大きさ size */
  124.     G_BLACK,        /* @文字色 fore */
  125.     G_LGRAY,        /* @背景色 back */
  126.     0b00100,        /* @フラグ
  127.         bit0:リターンで終了するか, bit1:ファイル名の入力か
  128.         bit2:枠を描かないか, bit3:アイコンドロップを入力としないか
  129.         bit4:Sleepで斜線を引かない, bit5:幅広枠にする
  130.         bit6:入力があったら次のテキストMethodへ移るか
  131.         bit7:センタリング, bit8:右寄せ */
  132.     NULL,        /* @KeyDownイベントのフィルター */
  133.     1,                /* @テキストアクティブフラグ */
  134. };
  135.  
  136. m_control_t    cprev = {{60 , 0, 60  + 6*6 + X_STDBTN, 0 + DY_STDBTN}, 0, 0, 1, 0, "\@▲"},
  137.         cnext  = {{108, 0, 108 + 6*6 + X_STDBTN, 0 + DY_STDBTN}, 0, 0, 1, 0, "\@▼"},
  138.         cup  = {{156, 0, 156 + 6*6 + X_STDBTN, 0 + DY_STDBTN}, 0, 0, 1, 0, "\@<"};
  139.  
  140. char menuFont[] =
  141.     "^1ROM 12dot,"
  142.     "^2ROM 16dot,"
  143.     "^3ROM 24dot";
  144. m_menu_t
  145.     fontMM = {Rect(4, 1, 38, 19), 0b100, (long) "\@フォント選択", (long) menuFont, NULL, 0b100};
  146.  
  147. m_mouse_t mmTM = { {0,21,1024,1024} , 0  };    /* 左ボタンアップ */
  148.  
  149. /*
  150.  * Method定義
  151.  */
  152. int LCCBtnProc();
  153. int FnameProc();
  154. int MenuProc();
  155. method_t
  156.     mTextTM =    {NULL, m_STRING, &textTM, FixAll},
  157.     mFontMM =    {NULL, m_MENU, &fontMM, MenuProc},
  158.     mNext = {NULL, m_STDBTN, &cnext, DispNext},
  159.     mPrev = {NULL, m_STDBTN, &cprev, DispPrev},
  160.     mUp = {NULL, m_STDBTN, &cup, DispUp};
  161.                 /* 次のMethodへ, 種類, 実際の定義へ, 処理関数 */
  162. method_t
  163.     mMmTM    =    {NULL, m_MSLUP, &mmTM , MultiMouse};
  164.  
  165. /*
  166.  * Method Group定義
  167.  */
  168. method_t *textMG[] = {&mTextTM , &mFontMM , &mNext , &mPrev , &mUp , &mMmTM , NULL};
  169. /* method_t *textMG[] = {&mFontMM , &mTextTM , &mNext , &mPrev , &mImageBtn , &mLinkBtn , &mSoundBtn , NULL}; */
  170.  
  171. /*
  172.  * メインウインドウの描画関数
  173.  */
  174. int MainDraw()
  175. {
  176.     extern rectImg kankyouRImg;
  177.     rect winside;
  178.     point_t wsize;
  179.     GetWinInside(&mainWin, &winside);
  180.     wsize = ULSizeOfRect(&winside);
  181.     ULD3LineH(Point_t(0, 20), Point_t(Pt_x(wsize), 0), 1);
  182.     GMPlotImg((unsigned short *) &kankyouRImg.data, &kankyouRImg.bounds, 0x300);
  183.     return 0;
  184. }
  185.  
  186.  
  187. int showhide( void )
  188. {
  189.     if( nextflg == 1 )
  190.     {
  191.         AwakeMethod( &mNext , 1 );
  192.     } else {
  193.         SleepMethod( &mNext , 1 );
  194.     };
  195.  
  196.     if( rirekimax > 1 )
  197.     {
  198.         AwakeMethod( &mPrev , 1 );
  199.     } else {
  200.         SleepMethod( &mPrev , 1 );
  201.     };
  202.  
  203.     if( menukaisoumax > 1 )
  204.     {
  205.         AwakeMethod( &mUp , 1 );
  206.     } else {
  207.         SleepMethod( &mUp , 1 );
  208.     };
  209.  
  210.     return( 0 );
  211. };
  212.  
  213. /* tsugi */
  214. int DispNext( void )
  215. {
  216.     get_next( );
  217.     Set_text( );
  218.     showhide( );
  219.  
  220.     return( 1 );
  221. }
  222.  
  223. /* mae */
  224. int DispPrev( void )
  225. {
  226.     get_foward( );
  227.     Set_text( );
  228.     showhide( );
  229.  
  230.     return( 1 );
  231. }
  232.  
  233. /* 1つ上の階層 */
  234. int DispUp( void )
  235. {
  236.     get_up( );
  237.     Set_text( );
  238.     showhide( );
  239.  
  240.     return( 1 );
  241. }
  242.  
  243. int DispMenu( )
  244. {
  245.     Set_text( );
  246.     showhide( );
  247.  
  248.     return( 1 );
  249. };
  250.  
  251. int DispImage( unsigned int filepos )
  252. {
  253.     static    char    fockname[] = "eb_graph.x";
  254. /*                          012345678901234567890123456 */
  255.     char    *comline = NULL;
  256.     char    *work = NULL;
  257.     char    *workptr;
  258.     int    stat;
  259.  
  260.     comline = (char *)_ULMALLOC( 280 );
  261.     if( comline == NULL )
  262.     {
  263.         return( 1 );
  264.     }
  265.  
  266.     work    = (char *)_ULMALLOC( 100 );
  267.     if( work == NULL )
  268.     {
  269.         return( 1 );
  270.     }
  271.  
  272.     /* コマンドラインの作成 */
  273.     strcpy( comline , " -t" );
  274.     workptr = work;
  275.     ULUsingX( workptr, filepos , 16 );
  276.     while( *workptr == ' ' && *workptr != 0 )        /* 頭のスペースをとばす */
  277.         workptr++;
  278.     strcat( comline, workptr );
  279.  
  280.     /* ファイル名 */
  281.     strcat( comline , " -f" );
  282.     strcat( comline , bunkenFile );
  283.  
  284.     /* ウィンドウタイトル */
  285.     strncpy( work , tex , 14 );
  286.     work[ 14 ] = '\0';
  287.     strcat( comline , " -n" );
  288.     strcat( comline , work );
  289.  
  290.     *comline = strlen( comline+1 );
  291.     stat = TSFockB( 0, fockname , comline , 0,fockname ); 
  292.  
  293.     _ULFREE( work );
  294.     _ULFREE( comline );
  295.  
  296.     return( 1 );
  297. }
  298.  
  299. int DispImageEP( unsigned int filepos )
  300. {
  301.     static    char    fockname[] = "eb_graph.x";
  302. /*                          012345678901234567890123456 */
  303.     char    *comline = NULL;
  304.     char    *work = NULL;
  305.     char    *workptr;
  306.     int    stat;
  307.  
  308.     comline = (char *)_ULMALLOC( 280 );
  309.     if( comline == NULL )
  310.     {
  311.         return( 1 );
  312.     }
  313.  
  314.     work    = (char *)_ULMALLOC( 100 );
  315.     if( work == NULL )
  316.     {
  317.         return( 1 );
  318.     }
  319.  
  320.     /* コマンドラインの作成 */
  321.     strcpy( comline , " -t" );
  322.     workptr = work;
  323.     ULUsingX( workptr, filepos , 16 );
  324.     while( *workptr == ' ' && *workptr != 0 )        /* 頭のスペースをとばす */
  325.         workptr++;
  326.     strcat( comline, workptr );
  327.  
  328.     /* ファイル名 */
  329.     strcat( comline , " -e -f" );
  330.     strcat( comline , bunkenFile );
  331.  
  332.     /* ウィンドウタイトル */
  333.     strncpy( work , tex , 14 );
  334.     work[ 14 ] = '\0';
  335.     strcat( comline , " -n" );
  336.     strcat( comline , work );
  337.  
  338.     strcat( comline , " -x" );
  339.     workptr = work;
  340.     ULUsingX( workptr, gra_x , 8 );
  341.     while( *workptr == ' ' && *workptr != 0 )        /* 頭のスペースをとばす */
  342.         workptr++;
  343.     strcat( comline, workptr );
  344.  
  345.     strcat( comline , " -y" );
  346.     workptr = work;
  347.     ULUsingX( workptr, gra_y , 8 );
  348.     while( *workptr == ' ' && *workptr != 0 )        /* 頭のスペースをとばす */
  349.         workptr++;
  350.     strcat( comline, workptr );
  351.  
  352.     *comline = strlen( comline+1 );
  353.     stat = TSFockB( 0, fockname , comline , 0,fockname ); 
  354.  
  355.     _ULFREE( work );
  356.     _ULFREE( comline );
  357.  
  358.     return( 1 );
  359. }
  360.  
  361. int DoSound()
  362. {
  363.     return( 1 );
  364. }
  365.  
  366. int DispLink( unsigned int filepos )
  367. {
  368.     static    char    fockname[] = "eb_hon.x";
  369. /*                          012345678901234567890123456 */
  370.     char    *comline = NULL;
  371.     char    *work = NULL;
  372.     char    *workptr;
  373.     int    stat;
  374.     int    limit = 0;
  375.  
  376.     comline = (char *)_ULMALLOC( 280 );
  377.     if( comline == NULL )
  378.     {
  379.         return( 1 );
  380.     }
  381.  
  382.     work    = (char *)_ULMALLOC( 100 );
  383.     if( work == NULL )
  384.     {
  385.         return( 1 );
  386.     }
  387.  
  388.     /* コマンドラインの作成 */
  389.     strcpy( comline , " -t" );
  390.     workptr = work;
  391.     ULUsingX( workptr, filepos , 16 );
  392.     while( *workptr == ' ' && *workptr != 0 )    /* 頭のスペースをとばす */
  393.         workptr++;
  394.     strcat( comline, workptr );
  395.  
  396.     strcat( comline , " -f" );
  397.     strcat( comline , bunkenFile );
  398.  
  399.     if( e_key == 1 )
  400.     {
  401.         strcat( comline , " -e" );
  402.     };
  403. /*
  404.     strcat( comline , " -g" );
  405.     workptr = work;
  406.     ULUsingX( workptr, limit , 8 );
  407.     while( *workptr == ' ' && *workptr != 0 )    */ /* 頭のスペースをとばす */
  408. /*        workptr++;
  409.     strcat( comline, workptr );
  410. */
  411.     *comline = strlen( comline+1 );
  412.     stat = TSFockB( 0, fockname , comline , 0,fockname ); 
  413.  
  414.     _ULFREE( work );
  415.     _ULFREE( comline );
  416.  
  417.     return( 1 );
  418. };
  419.  
  420.  
  421. int MultiMouse()
  422. {
  423.     tEdit    **thdl = textTM.tHdl;
  424.     char    work[ 32 ];
  425.     char    *pst = textTM.tStr;
  426.     char    stat;
  427.  
  428.     stat = GMPtInRect( &textTM.tRect , mmTM.msPt );
  429.     if( stat > 0 )
  430.     {
  431.         if( (*thdl)->selStart == (*thdl)->selEnd )
  432.         {
  433.             if( strncmp( "◎" , pst+(*thdl)->selStart, 2 ) == 0 )
  434.             {
  435.                 find_linkdata( (*thdl)->selStart );
  436.                 /* カーソル位置がそのままだと、再度ウィンドウがアクティベートされた時、
  437.                    勝手にグラフィックウィンドウ等が開いてしまうので、一応変えておく */
  438.                 TMOffsetSel( thdl , ((*thdl)->selStart)+2 ,0 );
  439.  
  440. /* TMSetSelect( thdl , ((*thdl)->selStart)+2 , ((*thdl)->selEnd)+2 , (*thdl)->selStart+2 );    */
  441.             };
  442.         };
  443.     };
  444.     return 1;
  445. }
  446.  
  447. /*
  448.  * メニューの処理
  449.  */
  450. const point_t fSizeLst[3] = {Point_t(12, 12), Point_t(16, 16), Point_t(24, 24)};
  451. int MenuProc()
  452. {
  453.     switch (fontMM.mValue) {
  454.       case 1:
  455.       case 2:
  456.       case 3: /* フォントサイズの直接指定 */
  457.         ChangeFontSize(fSizeLst[fontMM.mValue-1]);
  458.         DrawMethod(&mTextTM);
  459.         break;
  460.     };
  461.     return 1;
  462. }
  463.  
  464. /*
  465.  * ウインドウのサイズが変わった時、テキストの見える範囲(view rect)
  466.  * を補正する。するとスクロールバーの最大値も変わる。
  467.  *
  468.  * また、テキストが編集された時、テキストの方のサイズが変わるので
  469.  * 補正しなくてはならない。
  470.  */
  471. int FixAll()
  472. {
  473.     tEdit **thdl = textTM.tHdl;
  474.     tOffset dofst;
  475.     int dx, dy, vx, vy, /* dx, dy テキストの大きさ, vx, vy 見える範囲の大きさ */
  476.         x_max = 0, y_max = 0, fontx3, fonty3;
  477.  
  478.     rect dRec={0,22,300,65535};
  479.     ClipOnContents(&mainWin);
  480.     GetWinInside(&mainWin, &dRec);    /* ken */
  481.  
  482.     GetWinInside(&mainWin, &textTM.tRect);
  483.     TMGetDestOffset(textTM.tHdl, (long *) &dofst);
  484.     textTM.tRect.top = 22;
  485.  
  486.     dRec.top = 22;
  487.     dRec.bottom = 0x4ffff;
  488.  
  489.     _PushStatusTM(&mTextTM);
  490.     TMHide(thdl);
  491.  
  492.     TMSetRect(thdl , &dRec , &textTM.tRect);
  493.     TMGetDestOffset(textTM.tHdl, &dofst);
  494.  
  495. /*    TMSetView(thdl, &textTM.tRect); */
  496.  
  497.     dx = (*thdl)->dest.right - (*thdl)->dest.left;
  498.     dy = (*thdl)->nLines * (*thdl)->lineHeight; /* テキスト行数×改行幅 */
  499.     /* 何故次の行を入れるとうまくいってしまうのか分からない */
  500. /*     GMSizeRect(&(*thdl)->dest, Pt_t(dx, dy)); */
  501.  
  502.     vx = textTM.tRect.right - textTM.tRect.left;
  503.     vy = textTM.tRect.bottom - textTM.tRect.top;
  504.     fontx3 = Pt_x(fontSize)*3;
  505.     fonty3 = Pt_y(fontSize)*3;
  506.  
  507.     /* スクロールする数を得る */
  508.     /* d? - v?でスクロールすべきドット数が出る。*/
  509.     if (dx > vx)
  510.         x_max = 1 + (dx - vx)/(fontx3); /* スクロール単位は半角6文字分づつ */
  511.     if (dy > vy)
  512.         y_max = 1 + (dy - vy)/(fonty3); /* スクロール単位は3列分づつ */
  513.         /* 1を足しているのは端数を繰り上げさせるため */
  514.  
  515.     MaxSetScrBar(&mainWin, Point_t(x_max, y_max));
  516.     /* スクロールバーがページ操作された時の変化量を代入 */
  517. /*    SetPageValueScroll(mainWin.hHdl, vx / fontx3); */
  518.     SetPageValueScroll(mainWin.vHdl, vy / fonty3);
  519.  
  520.     TMShow(thdl);
  521.     TMUpDate( thdl , &textTM.tRect ); /* ken */
  522.  
  523.     if (y_max <= 0 && dofst.Voffset > 0) {/* スクロール出来ないのにスクロールした状態なら */
  524.         TMSetDestOffset(textTM.tHdl, dofst.Hoffset, 0);
  525.         dofst.Voffset = 0;
  526.     }
  527.  
  528.     /* スクロールバーの値を正す */
  529.     ValueSetScrBar(&mainWin,
  530.         Point_t(dofst.Hoffset/fontx3, dofst.Voffset/fonty3));
  531.  
  532.     _PopStatusTM();
  533.     return 1; /* このMethodの処理をした */
  534. }
  535.  
  536. /*
  537.  * スクロールバーの現在値を、0.5秒毎に書き直す。
  538.  */
  539. int SetCurValScrBar(tsevent *ev)
  540. {
  541.     static long last_scr_bar = 0;
  542.     tOffset dofst;
  543.     int fontx3, fonty3;
  544.  
  545.     if (last_scr_bar + 50 > ev->when)
  546.         return 0;
  547.     last_scr_bar = ev->when;
  548.  
  549.     TMGetDestOffset(textTM.tHdl, (long *) &dofst);
  550.  
  551.     fontx3 = Pt_x(fontSize)*3;
  552.     fonty3 = Pt_y(fontSize)*3;
  553.  
  554.     /* スクロールバーの値を正す */
  555.     ValueSetScrBar(&mainWin,
  556.         Point_t(dofst.Hoffset/fontx3, dofst.Voffset/fonty3));
  557.  
  558.     return 0;
  559. }
  560.  
  561. void AdjText() /* スクロールバーの値が変更した時にテキスト位置を調節 */
  562. {
  563.     point_t val = ValueGetScrBar(&mainWin);
  564.     _PushStatusTM(&mTextTM);
  565.     TMSetDestOffset(textTM.tHdl,
  566.         Pt_x(val)*(Pt_x(fontSize)*3), Pt_y(val)*(Pt_y(fontSize)*3));
  567.     _PopStatusTM();
  568. }
  569.  
  570. /*
  571.  * メインループ
  572.  */
  573. void MainLoop()
  574. {
  575.     order_t order;
  576.     while (true) {
  577.         order.ev = MayIHelpYou();
  578.         switch (order.ev) {
  579.           case EV_CLOSEALL:    /* 終了指令 */
  580.           case EV_CLOSEWIN:    /* ウインドウクローズ指令 */
  581.             return;
  582.           case EV_WINGROW:
  583.           case EV_WINZMIN:
  584.           case EV_WINZMOUT:
  585.             FixAll();        /* テキストの大きさやスクロールバーを補正 */
  586.             break;
  587.           case EV_SCROLLH:
  588.           case EV_SCROLLV:
  589.             AdjText();        /* スクロールバーの移動にテキストを追従させる */
  590.             break;            /* 但し疑似ダイアログの入力でない時のみにしたい.. */
  591.         }
  592.     }
  593. }
  594.  
  595. void ChangeFontSize(point_t siz)
  596. {
  597.     int kind = -2, mkind = 0b100000;
  598.     tEdit **thdl = textTM.tHdl;
  599.     if (fontSize == siz)    /* サイズ変更は無し */
  600.         return;
  601.  
  602.     EMEnCross(0);
  603.     /* フォントサイズを変更 */
  604.     textTM.tSize = fontSize = siz;
  605.     (*thdl)->lineHeight = Pt_y(siz);
  606.     (*thdl)->tabSize = Pt_x(siz)*8;        /* タブは8文字分 */
  607.  
  608.     /* 種類変更 */
  609.     switch (Pt_x_y(siz)) {
  610.       case Pt_x_y(Point_t(12,12)):
  611.         kind = 0;    /* ROM12にする */
  612.         mkind = 0b10;
  613.         break;
  614.       case Pt_x_y(Point_t(16,16)):
  615.         kind = 1;    /* ROM16 */
  616.         mkind = 0b100;
  617.         break;
  618.       case Pt_x_y(Point_t(24,24)):
  619.         kind = 2;    /* ROM24 */
  620.         mkind = 0b1000;
  621.         break;
  622.     }
  623.     textTM.tKind = kind < 0 ? -kind:kind;
  624.     /* メニューに記録 */
  625.     fontMM.mCheck = mkind;
  626.     /* 表示などの座標を計算し直す */
  627.     _PushStatusTM(&mTextTM);
  628.     TMCalSelPoint(thdl);
  629.     TMCalText(thdl);
  630.     _PopStatusTM();
  631.     FixAll();
  632.     AdjText();
  633.     EMDeCross();
  634. }
  635.  
  636. job_t scrBarJob = {
  637.     NULL,        /* 次のJobへ.これは気にしなくていい */
  638.     SetCurValScrBar,    /* int (*Proc)(tsevent *) */
  639.     NULL,        /* int (*Constructor)(struct stieve_jobs *); */
  640.     NULL,        /* int (*Destructor)(struct stieve_jobs *); */
  641.     NULL,        /* int (*Sleep)(struct stieve_jobs *); */
  642.     NULL,        /* int (*Awake)(struct stieve_jobs *); */
  643.     0,            /* sleep */
  644. };
  645.  
  646. int Set_text( )
  647. {
  648.     ActivateTMethod( NULL , NULL );
  649.     UnchainAMethod( &mTextTM );
  650.  
  651.     textTM.tStr = tex;
  652.     textTM.tMax = strlen( tex );
  653.  
  654.     ChainAMethod( NULL , &mainWin , &mTextTM );        /* 先頭に登録 */
  655.  
  656.      (*textTM.tHdl)->drawMode = 0b010000;    /* 改行コードとEOFを表示 */
  657.     (*textTM.tHdl)->locateH = (*textTM.tHdl)->locateV = 0; /* カーソルを0位置に */
  658.     ValueSetScrBar(&mainWin, 0);        /* テキストの一番左上部分を見るように */
  659.     (*textTM.tHdl)->lineHeight = 16;
  660.     (*textTM.tHdl)->tabSize = 16*8;        /* タブは8文字分 */
  661.  
  662.     ActivateTMethod(&mTextTM, &mainWin);
  663.  
  664. /*    AdjText(); */
  665.  
  666.     TMCalSelPoint(textTM.tHdl);
  667.     TMCalText(textTM.tHdl);
  668.     TMOffsetSel( textTM.tHdl , 2 ,0 );
  669.  
  670.     FixAll();            /* テキストの大きさやスクロールバーを補正 */
  671.  
  672.     return( 0 );
  673. }
  674.  
  675.  
  676. /*
  677.  * 初期化ルーチン
  678.  */
  679. int Init()
  680. {
  681.     rect trect = MAIN_GSIZE;
  682.     rect drect = textTM.tRect;
  683.     rect trect2 = textTM.tRect;
  684.  
  685.  
  686.     if (ChainMethodIn(&mainWin, textMG) < 0)
  687.         return -1;    /* Method登録 */
  688.      (*textTM.tHdl)->drawMode = 0b010000;    /* 改行コードとEOFを表示 */
  689.     SetWinGrowSize(&mainWin, &trect);    /* ウインドウの最小最大サイズ設定 */
  690.  
  691.     if( tex != NULL )
  692.     {
  693.         (*textTM.tHdl)->locateH = (*textTM.tHdl)->locateV = 0; /* カーソルを0位置に */
  694.         ValueSetScrBar(&mainWin, 0);        /* テキストの一番左上部分を見るように */
  695.         (*textTM.tHdl)->lineHeight = 16;
  696.         (*textTM.tHdl)->tabSize = 16*8;        /* タブは8文字分 */
  697.  
  698.         TMOffsetSel( textTM.tHdl , 2 ,0 );
  699.  
  700. /*        AdjText(); */
  701.         _PushStatusTM(&mTextTM);
  702.         TMCalSelPoint(textTM.tHdl);
  703.         TMCalText(textTM.tHdl);
  704.         _PopStatusTM();
  705.     };
  706.  
  707.     FixAll();                            /* テキストの大きさやスクロールバーを補正 */
  708.  
  709.     ChainJob(&scrBarJob);                /* スクロールバー書き換え用 */
  710.     return 0;
  711. }
  712.  
  713. /*
  714.  * メインルーチン
  715.  */
  716. void main(int ac, char *av[])
  717. {
  718.     int i;
  719.     char    *ptr;
  720.     unsigned int    seekptr = 0;
  721.     int    stat;
  722.     int    offset;
  723.     int    linkflg;
  724.     int    leng;
  725.  
  726.     tex = NULL;
  727. /*    link = NULL; */
  728.  
  729.     if( ac < 2 )
  730.     {
  731.         return;
  732.     };
  733.  
  734.     tex = _ULMALLOC( 0x800*10 );    /* とりあえず適当なサイズで確保 */
  735.     if( tex == NULL )
  736.     {
  737.         ULError(  "メモリが確保できません" );
  738.         return;
  739.     }
  740.  
  741.     /* コマンドラインオプションの読み取り */
  742.     for (i = 1; i < ac; i++) {
  743.         ptr = av[i];
  744.         switch (*ptr) {
  745.           case '/':
  746.           case '-':
  747.             ptr++;
  748.             if ('t' == *ptr )
  749.             {
  750.                 ptr++;
  751.                 seekptr = ULSTOX( ptr );
  752.             } else if ('f' == *ptr )
  753.             {
  754.                 ptr++;
  755.                 cdfile = TSOpen( ptr , 0 );
  756.                 bunkenFile = ptr;
  757.                 if( cdfile < 0 )
  758.                 {
  759.             /*        ULError_str( "Error ファイルがオープンできません path=\n" , ptr );
  760.             */        return;
  761.                 };
  762.             } else if ('e' == *ptr )
  763.             {
  764.                 ptr++;
  765.                 e_key = 1;
  766.             } else if ('g' == *ptr )
  767.             {
  768.                 ptr++;
  769.             };
  770.             break;
  771.         }
  772.     }
  773.     set_gaiji( 1 );
  774.  
  775.     init_linktbl( );
  776.     init_rirekitbl( );
  777.     init_kaisoutbl( );
  778.     push_menukaisou( seekptr );
  779.  
  780. /* ULError_int( seekptr );
  781. */    DOSSEEK( cdfile , seekptr , SEEK_SET );
  782.     offset = jis2shift( tex , 0x800*4 , 0 , &nextflg );
  783.     textTM.tStr = tex;
  784.     textTM.tMax = strlen( tex );
  785.  
  786. /* ULError_int( offset+seekptr );
  787. */    if (OpenWindow(&mainWin, -1)) {
  788.         ULError( "ウインドウさえ開きません" );
  789.         TSClose( cdfile );
  790.         _ULFREE(tex);    /* kenji */
  791.         return;
  792.     }
  793.  
  794.     linkflg = 1;
  795.     nextpos = seekptr+offset;
  796.     if( nextflg == 1 )    /* メニュー項目の場合は履歴に残さない(nextを禁止する) */
  797.     {
  798. /* printf( "PUSH RIREKI\n" ); */
  799.         push_rireki( seekptr );
  800.     };
  801.  
  802.     /* ウィンドウタイトルの作成 */
  803.     wintitle[ 1 ] = '\0';
  804.     strcpy( wintitle+1 , "本文 [" );
  805.     strncpy( wintitle+7 , tex , 16 );
  806.     wintitle[ 23 ] = '\0';
  807.     strcat( wintitle+1 , "]" );
  808.     wintitle[ 0 ] = strlen( wintitle+1 );
  809.     WMTitleSet( mainWin.wptr , wintitle );
  810.  
  811.     if (Init() >= 0)
  812.     {
  813.         showhide( );
  814.         MainLoop();
  815.         UnchainMethod();
  816.         UnchainJob();
  817.     } else {
  818.         ULError( "Methodが登録できません" );
  819.     };
  820.  
  821.     CloseWindow(&mainWin);
  822.     if( tex != NULL )
  823.     {
  824.         _ULFREE(tex);    /* kenji */
  825.     };
  826.     if( cdfile != 0 )
  827.     {
  828.         TSClose( cdfile );
  829.     };
  830.  
  831.     return;
  832. }
  833.